//
// Created by Jisam on 27/08/2024 9:12 PM.
// Solution of  P5521 [yLOI2019] 梅深不见冬
//#pragma GCC optimize(3)
#include <bits/stdc++.h>

using namespace std;
#define endl "\n"
#define PSI pair<string,int>
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define VVI vector<vector<int>>
#define VI vector<int>
#define VS vector<string>
#define PQLI priority_queue<int, vector<int>, less<int>>
#define PQGI priority_queue<int, vector<int>, greater<int>>
#define code_by_jisam ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
typedef long long i64;
typedef unsigned u32;
typedef unsigned long long u64;
typedef __int128 i128;
int dx[] = {-1, 1, 0, 0, 1, 1, -1, -1,};
int dy[] = {0, 0, -1, 1, 1, -1, -1, 1,};

// 定义最大数组大小，以容纳足够的元素
const int MAXN = 1e5 + 10;
// MU数组存储每个节点的某种值
int MU[MAXN];
// ans数组用于存储每个节点的答案
int ans[MAXN];
// son数组存储每个节点的子节点，构建树的结构
vector<int> son[MAXN];

/**
 * 深度优先搜索函数
 * @param u 当前遍历的节点
 */
void dfs(const int u) {
    // 遍历当前节点的所有子节点，并递归调用dfs
    for (auto v: son[u]) {
        dfs(v);
    }
    // 对子节点按一定规则排序，以便优化后续的计算
    sort(son[u].begin(), son[u].end(), [&](const int &x, const int &y) {
        return (ans[x] - MU[x]) > (ans[y] - MU[y]);
    });

    // temp用于记录当前节点的累加值
    int temp = 0;
    for(auto v : son[u]){
        // 根据当前累加值和子节点的ans值，更新temp或ans[u]
        if(temp  >= ans[v]){
            temp -= MU[v];
        }else{
            ans[u] += ans[v] - temp;
            temp = ans[v] - MU[v];
        }
    }
    // 确保考虑节点u自身的MU值
    ans[u] += max(0,MU[u] - temp);
}

/**
 * 解决方案的主函数
 */
void solution() {
    int n;
    cin >> n;
    int x;

    // 构建树的结构，父节点指向子节点
    for (int i = 2; i <= n; i++) {
        cin >> x;
        son[x].push_back(i);
    }

    // 输入每个节点的MU值
    for (int i = 1; i <= n; i++) {
        cin >> MU[i];
    }
    // 从根节点开始深度优先搜索
    dfs(1);

    // 输出每个节点的答案
    for (int i = 1; i < n; i++) {
        cout << ans[i] <<" ";
    }

    // 特别输出根节点的答案
    cout << ans[n];
}




int main() {
    code_by_jisam;
    int T = 1;
//    cin >> T;
    while (T--) {
        solution();
    }
    return 0;
}